package com.wmh.baseservice.common.redis.mq.core.interceptor;

import cn.hutool.core.util.TypeUtil;
import com.wmh.baseservice.common.redis.mq.core.message.RedisMessageBase;

import java.lang.reflect.Type;

/**
 * 消息拦截器 , 在 发布消息/消费消息 的前后进行处理
 *
 * @author 审心
 */
public interface RedisMessageInterceptor<T extends RedisMessageBase> {
    /**
     * 发布之前拦截处理
     *
     * @param message 消息
     */
    default void sendBeforeHandler(T message) {
    }

    /**
     * 发布之后拦截处理
     *
     * @param message 消息
     */
    default void sendAfterHandler(T message) {
    }

    /**
     * 消费之前拦截处理
     *
     * @param message 消息
     */
    default void consumeBeforeHandler(T message) {
    }

    /**
     * 消费成功拦截器处理
     * @param message 消息
     */
    default void consumeSucceedHandler(T message) {
    }

    /**
     * 消费最终拦截处理
     *
     * @param message 消息
     */
    default void consumeFinallyHandler(T message) {
    }

    /**
     * 优先级 值越低优先级越高
     *
     * @return 优先级
     */
    default int getPriority() {
        return 0;
    }

    /**
     * 通过解析类上的泛型，获得消息类型
     *
     * @return 消息类型
     */
    @SuppressWarnings("unchecked")
    default Class<T> getMessageClass() {
        Type type = TypeUtil.getTypeArgument(getClass(), 0);
        if (type == null) {
            throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName()));
        }
        return (Class<T>) type;
    }
}
